package com.bjsdzk.collector.otherFlatform;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;

public class OneNet {
	public static String assembleToken(String version, String resourceName, String expirationTime,
			String signatureMethod, String accessKey)
			throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
		StringBuilder sb = new StringBuilder();
		String res = URLEncoder.encode(resourceName, "UTF-8");
		String sig = URLEncoder
				.encode(generatorSignature(version, resourceName, expirationTime, accessKey, signatureMethod), "UTF-8");
		sb.append("version=").append(version).append("&res=").append(res).append("&et=").append(expirationTime)
				.append("&method=").append(signatureMethod).append("&sign=").append(sig);
		return sb.toString();
	}

	public static String generatorSignature(String version, String resourceName, String expirationTime,
			String accessKey, String signatureMethod) throws NoSuchAlgorithmException, InvalidKeyException {
		String encryptText = expirationTime + "\n" + signatureMethod + "\n" + resourceName + "\n" + version;
		String signature;
		byte[] bytes = HmacEncrypt(encryptText, accessKey, signatureMethod);
		signature = Base64.getEncoder().encodeToString(bytes);
		return signature;
	}

	public static byte[] HmacEncrypt(String data, String key, String signatureMethod)
			throws NoSuchAlgorithmException, InvalidKeyException {
		// 根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
		SecretKeySpec signinKey = null;
		signinKey = new SecretKeySpec(Base64.getDecoder().decode(key), "Hmac" + signatureMethod.toUpperCase());

		// 生成一个指定 Mac 算法 的 Mac 对象
		Mac mac = null;
		mac = Mac.getInstance("Hmac" + signatureMethod.toUpperCase());

		// 用给定密钥初始化 Mac 对象
		mac.init(signinKey);

		// 完成 Mac 操作
		return mac.doFinal(data.getBytes());
	}

	public enum SignatureMethod {
		SHA1, MD5, SHA256;
	}

	public static void main(String[] args)
			throws UnsupportedEncodingException, NoSuchAlgorithmException, InvalidKeyException {
		String version = "2018-10-31";
//		String version = "2019-09-10";
		String resourceName = "products/275848/devices/1221";
		String expirationTime = System.currentTimeMillis() / 1000 + 100 * 24 * 60 * 60 + "";
		String signatureMethod = SignatureMethod.SHA1.name().toLowerCase();
		String accessKey = "TkZgIxDn3oiZBBkxgk2CqMsorVed/C32b+VrOPjjgTY="; 
//		String accessKey = "cKIKQdhqfMEsLDYEeIcnhPCgqzKh6nZJIhC/GuSciCI="; 
		String token = assembleToken(version, resourceName, expirationTime, signatureMethod, accessKey);
		System.out.println( token);
	}
}

